package com.berchen.数据结构.队列;

/**
 * 循环队列
 */
public class RingsArrayQueue {

    private int size;   // 队列大小
    private int head_index; // 指向队列头的指针
    private int tail_index; // 指向队列尾打指针
    private int count ; // 队列中现在有多少个元素
    private int[] queue;    // 队列

    public RingsArrayQueue(int size) {
        this.size = size;
        queue=new int[this.size];
        head_index=0;
        tail_index=-1;
    }

    /**
     * 判断队列是否满
     * @return
     */
    public boolean isFull(){
        return count==size;
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty(){
        return count==0;
    }

    /**
     * 往队列中添加元素
     * @param num
     * @return
     */
    public boolean add(int num){

        if(isFull()) return false;
        tail_index=(++tail_index)%size;
        queue[tail_index]=num;
        count++;
        return true;
    }

    /**
     * 获取队列头元素 不删除元素
     * @return
     */
    public int  get() {
        if(isEmpty())throw new RuntimeException("队列为空");
        return queue[head_index];
    }

    /**
     * 删除头元素 会返回头元素的值
     * @return
     * @throws Exception
     */
    public int remove(){
        if(isEmpty())throw new RuntimeException("队列为空");
        int num=queue[head_index];
        head_index=(head_index+1)%size;
        count--;
        return num;
    }

    /**
     * 遍历队列中的元素 从head_index -> tail_index
     */
    public void list(){
        if(isEmpty())throw new RuntimeException("队列为空");
        int index=head_index;
        for(int i=0;i<count;i++){
            System.out.printf("%d\t",queue[index]);
            index=(index+1)%size;
        }

        System.out.println();
    }
}
